package com.example.service.impl;




import com.example.dao.CheckGroupDao;
import com.example.domain.pojo.CheckGroup;
import com.example.domain.query.QueryPageBean;
import com.example.domain.result.PageResult;
import com.example.service.CheckGroupService;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
@Transactional //切点   //增强的方法 //织入
public class CheckGroupServiceImpl implements CheckGroupService {

    @Autowired
    private CheckGroupDao checkGroupDao;

    //添加检查组
    @Override
    public void addGroup(CheckGroup checkGroup, Integer[] checkitemIds) {
        //在业务逻辑层处理添加检查组信息,中间表也要添加信息
        //1:添加检查组,获取检查组id
        checkGroupDao.addGroup(checkGroup);

        //2:将返回的检查组的id和参数传递的id数组添加到中间表
        //2.1遍历检查项数组id
        groupAndItem(checkitemIds,checkGroup.getId());


    }

    //分页查询检查组
    @Override
    public PageResult findPage(QueryPageBean queryPageBean) {
        //1;查询分页数据
        PageHelper.startPage(queryPageBean.getCurrentPage(),queryPageBean.getPageSize());

        //2:根据条件查询 page对象封装
        Page<CheckGroup> droupList = checkGroupDao.findPage(queryPageBean.getQueryString());

        //3:封装total数据和集合
        return new PageResult(droupList.getTotal(),droupList.getResult());
    }

    //根据id查询选项组信息
    @Override
    public CheckGroup findCheckGroupById(Integer id) {
        //1:调用方法,可能id不存在
        CheckGroup checkGroupById = checkGroupDao.findCheckGroupById(id);
        //可是在检查组中包括检查项数据信息,需要借助中间表查询检查项信息id
        return checkGroupById;
    }
    //用检查组id借助中间表查询检查项的id
    @Override
    public Integer[] findItemIdByGroupId(Integer id){
        Integer[] ids = checkGroupDao.findItemIdByGroupId(id);
        return ids;
    }

    //编辑检查组信息
    @Override
    public void editGroup(CheckGroup checkGroup) {
        //1:将checkGroup数据保存导数据库
        checkGroupDao.editGroup(checkGroup);
    }

    //单独将item的id数组拿出来
    @Override
    public void editGroupAndItem(Integer groupId,Integer[] ids) {
        //1:清除原有的中间表关联关系delectItemIdByGroupid
        checkGroupDao.delectItemIdByGroupid(groupId);
        //2:建立新的表关联关系
        groupAndItem(ids,groupId);
    }

    //中间表建立关联关系,将这个建立关联关系的过程抽取出来
    public void groupAndItem(Integer[] ids,Integer groupId){
       //判断id数组是否为空
        if(ids!=null&&ids.length>0){
            for (Integer id : ids) {
                Map<String,Integer> map=new HashMap<>();
                map.put("checkitemId",id);
                map.put("groupId",groupId);
                checkGroupDao.addGroupAndItem(map);
            }
        }
    }

    //删除检查组
    @Override
    public void deleteGroup(Integer id) {
        //1:删除中间表
        //需要考虑到是否有关联关系
        //1.1先查询中间表是否有关联关系,没有直接删除,有
        //事物
        checkGroupDao.delectItemIdByGroupid(id);
        //2:删除group
        checkGroupDao.deleteGroupById(id);
    }

    //查询所有的选项组的id
    @Override
    public List<CheckGroup> findAllGroup() {
        List<CheckGroup> allGroup = checkGroupDao.findAllGroup();
        return allGroup;
    }


}
